const fp = require('lodash/fp');
const { parseInt } = require("lodash");
const { MayBe, Container } = require('./Functors');

// 练习1、使用fp.add(x,y)和fp.map(f,x)创建一个能让functor里的值增加的函数ex1
let maybe = MayBe.of([5, 6, 1]);
let ex1 = (functor, num) => {
  // 你要实现的函数
  const handler = fp.map(fp.add(num));
  return functor.map(handler);
}
let a = ex1(maybe, 3);
console.log(a);

// 练习2：实现一个函数ex2，能够使用fp.first获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = (functor) => {
  // 你要实现的函数
  return functor.map(fp.first)._value;
}
let b = ex2(xs);
console.log(b);

// 练习3：实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
  return MayBe.of(o[x]);
})
let user = { id: 2, name: 'Albert' };
let ex3 = () => {
  // 你需要实现的函数。。。
  return safeProp('name', user).map(fp.first)._value;
}
console.log(ex3());

// 练习4：使用Maybe重写ex4，不要有if语句
// let ex4 = function (n) {
//   if (n) {
//     return parseInt(n);
//   }
// }

let ex4 = function (n) {
  return MayBe.of(n).map(parseInt)._value;
}
console.log(ex4('4d33'));